package persistencia;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import util.Conexion;
import bean.Inventario;
import bean.Reporte;
import bean.TSTOCK;

public class TINFISDAO {

	public List<Inventario> buscar(Inventario objInventario)
			throws SQLException {
		String sql = "select a.*,trim(b.artdes) ||' - ' ||b.artmed artdes from prodtecni.tinfis a inner join tarti b on a.articulo=b.artcod "
				+ "where a.situacion='01' and a.secuencia=0 ";
		String filtro = "";
		List<Inventario> inventarios = new ArrayList<Inventario>();
		int secuencia = 0;
		if (!objInventario.getAlmacen().trim().isEmpty()) {
			filtro+="and almacen=? ";
		}
		if (!objInventario.getArticulo().trim().isEmpty()) {
			filtro+="and articulo=? ";
		}
		if (!objInventario.getZona().trim().isEmpty()) {
			filtro+="and zona=? ";
		}
		if (!objInventario.getUbicacion().trim().isEmpty()) {
			filtro+="and ubicacion=? ";
		}
		if (!objInventario.getsFicha().trim().isEmpty()) {
			filtro+="and ficha=? ";			
		}
		filtro+="order by almacen,zona,ubicacion,articulo ";
		PreparedStatement pstm = Conexion.obtenerConexion()
				.prepareStatement(sql+filtro);
		if (!objInventario.getAlmacen().trim().isEmpty()) {
			secuencia++;
			pstm.setString(secuencia, objInventario.getAlmacen().toUpperCase());
		}
		if (!objInventario.getArticulo().trim().isEmpty()) {
			secuencia++;
			pstm.setString(secuencia, objInventario.getArticulo().toUpperCase());
		}
		if (!objInventario.getZona().trim().isEmpty()) {
			secuencia++;
			pstm.setString(secuencia, objInventario.getZona().toUpperCase());
		}
		if (!objInventario.getUbicacion().trim().isEmpty()) {
			secuencia++;
			pstm.setString(secuencia, objInventario.getUbicacion().toUpperCase());
		}
		if (!objInventario.getsFicha().trim().isEmpty()) {
			secuencia++;
			pstm.setInt(secuencia, objInventario.getFicha());
		}
		ResultSet rs = pstm.executeQuery();
		while(rs.next()){
			Inventario inventario = new Inventario();
			inventario.setAlmacen(rs.getString("almacen"));
			inventario.setArticulo(rs.getString("articulo"));
			inventario.setZona(rs.getString("zona"));
			inventario.setUbicacion(rs.getString("ubicacion"));
			inventario.setSecuencia(rs.getInt("secuencia"));
			inventario.setCantidad(rs.getDouble("cantidad"));
			inventario.setSituacion(rs.getString("situacion"));
			inventario.setCodigoInventariador(rs.getString("codigoinventariador"));
			inventario.setCodigoDigitador(rs.getString("codigodigitador"));
			inventario.setFechaIngreso(rs.getString("fechaingreso"));
			inventario.setHoraIngreso(rs.getString("horaingreso"));
			inventario.setFicha(rs.getInt("ficha"));
			inventario.setFechaModificacion(rs.getString("fechamodifcacion"));
			inventario.setHoraModificacion(rs.getString("horamodifcacion"));
			inventario.setArtdes(rs.getString("artdes"));
			inventarios.add(inventario);
		}
		rs.close();
		pstm.close();
		return inventarios;
	}
	
	public List<Inventario> buscarReconteo(Inventario objInventario)
			throws SQLException {
		String sql = "select a.*,trim(b.artdes) ||' - ' ||b.artmed artdes from prodtecni.tinfis a inner join tarti b on a.articulo=b.artcod "
				+ "where a.situacion='01' and a.secuencia in "
				+ "(select max(c.secuencia) from prodtecni.tinfis c where c.almacen=a.almacen and c.articulo=a.articulo and c.zona=a.zona and c.ubicacion=a.ubicacion) ";
		String filtro = "";
		List<Inventario> inventarios = new ArrayList<Inventario>();
		int secuencia = 0;
		if (!objInventario.getAlmacen().trim().isEmpty()) {
			filtro+="and almacen=? ";
		}
		if (!objInventario.getArticulo().trim().isEmpty()) {
			filtro+="and articulo=? ";
		}
		if (!objInventario.getZona().trim().isEmpty()) {
			filtro+="and zona=? ";
		}
		if (!objInventario.getUbicacion().trim().isEmpty()) {
			filtro+="and ubicacion=? ";
		}
		if (!objInventario.getsFicha().trim().isEmpty()) {
			filtro+="and ficha=? ";			
		}
		filtro+="order by a.almacen,a.zona,a.ubicacion,a.articulo ";
		PreparedStatement pstm = Conexion.obtenerConexion()
				.prepareStatement(sql+filtro);
		if (!objInventario.getAlmacen().trim().isEmpty()) {
			secuencia++;
			pstm.setString(secuencia, objInventario.getAlmacen().toUpperCase());
		}
		if (!objInventario.getArticulo().trim().isEmpty()) {
			secuencia++;
			pstm.setString(secuencia, objInventario.getArticulo().toUpperCase());
		}
		if (!objInventario.getZona().trim().isEmpty()) {
			secuencia++;
			pstm.setString(secuencia, objInventario.getZona().toUpperCase());
		}
		if (!objInventario.getUbicacion().trim().isEmpty()) {
			secuencia++;
			pstm.setString(secuencia, objInventario.getUbicacion().toUpperCase());
		}
		if (!objInventario.getsFicha().trim().isEmpty()) {
			secuencia++;
			pstm.setInt(secuencia, objInventario.getFicha());
		}
		ResultSet rs = pstm.executeQuery();
		while(rs.next()){
			Inventario inventario = new Inventario();
			inventario.setAlmacen(rs.getString("almacen"));
			inventario.setArticulo(rs.getString("articulo"));
			inventario.setZona(rs.getString("zona"));
			inventario.setUbicacion(rs.getString("ubicacion"));
			inventario.setSecuencia(rs.getInt("secuencia"));
			inventario.setCantidad(rs.getDouble("cantidad"));
			inventario.setSituacion(rs.getString("situacion"));
			inventario.setCodigoInventariador(rs.getString("codigoinventariador"));
			inventario.setCodigoDigitador(rs.getString("codigodigitador"));
			inventario.setFechaIngreso(rs.getString("fechaingreso"));
			inventario.setHoraIngreso(rs.getString("horaingreso"));
			inventario.setFicha(rs.getInt("ficha"));
			inventario.setFechaModificacion(rs.getString("fechamodifcacion"));
			inventario.setHoraModificacion(rs.getString("horamodifcacion"));
			inventario.setArtdes(rs.getString("artdes"));
			inventarios.add(inventario);
		}
		rs.close();
		pstm.close();
		return inventarios;
	}
	
	public int modificar(Inventario objInventario) throws SQLException{
		PreparedStatement pstm = Conexion.obtenerConexion()
				.prepareStatement("update prodtecni.tinfis set cantidad=?,ficha=?,codigoinventariador=?,codigodigitador=?,fechamodifcacion=?,horamodifcacion=? "
						+ "where almacen=? and articulo=? and zona=? and ubicacion=? and secuencia=?");
		pstm.setDouble(1, objInventario.getCantidad());
		pstm.setInt(2, objInventario.getFicha());
		pstm.setString(3, objInventario.getCodigoInventariador());
		pstm.setString(4, objInventario.getCodigoDigitador());
		pstm.setString(5, objInventario.getFechaModificacion());
		pstm.setString(6, objInventario.getHoraModificacion());
		pstm.setString(7, objInventario.getAlmacen());
		pstm.setString(8, objInventario.getArticulo());
		pstm.setString(9, objInventario.getZona());
		pstm.setString(10, objInventario.getUbicacion());
		pstm.setInt(11, objInventario.getSecuencia());
		int result = pstm.executeUpdate();
		pstm.close();
		return result;
	}
	
	public int deshabilita(Inventario objInventario) throws SQLException{
		PreparedStatement pstm = Conexion.obtenerConexion()
				.prepareStatement("update prodtecni.tinfis set situacion = '99',fechamodifcacion=?,horamodifcacion=? where almacen=? and articulo=? and zona=? and ubicacion=? and secuencia=?");
		pstm.setString(1, objInventario.getFechaModificacion());
		pstm.setString(2, objInventario.getHoraModificacion());
		pstm.setString(3, objInventario.getAlmacen());
		pstm.setString(4, objInventario.getArticulo());
		pstm.setString(5, objInventario.getZona());
		pstm.setString(6, objInventario.getUbicacion());
		pstm.setInt(7, objInventario.getSecuencia());
		int result = pstm.executeUpdate();
		pstm.close();
		return result;
	}
	
	public int eliminar(Inventario objInventario) throws SQLException{
		PreparedStatement pstm = Conexion.obtenerConexion()
				.prepareStatement("delete from prodtecni.tinfis where almacen=? and articulo=? and zona=? and ubicacion=? and secuencia=?");
		pstm.setString(1, objInventario.getAlmacen());
		pstm.setString(2, objInventario.getArticulo());
		pstm.setString(3, objInventario.getZona());
		pstm.setString(4, objInventario.getUbicacion());
		pstm.setInt(5, objInventario.getSecuencia());
		int result = pstm.executeUpdate();
		pstm.close();
		return result;
	}

	public int registrar(Inventario objInventario) throws SQLException {
		PreparedStatement pstm = Conexion
				.obtenerConexion()
				.prepareStatement(
						""
								+ "insert into prodtecni.tinfis(almacen,articulo,zona,ubicacion,secuencia,cantidad,situacion,codigoinventariador,codigodigitador,fechaingreso,horaingreso,ficha) values "
								+ "(?,?,?,?,?,?,?,?,?,?,?,?) ");
		pstm.setString(1, objInventario.getAlmacen());
		pstm.setString(2, objInventario.getArticulo());
		pstm.setString(3, objInventario.getZona());
		pstm.setString(4, objInventario.getUbicacion());
		pstm.setInt(5, objInventario.getSecuencia());
		pstm.setDouble(6, objInventario.getCantidad());
		pstm.setString(7, objInventario.getSituacion());
		pstm.setString(8, objInventario.getCodigoInventariador());
		pstm.setString(9, objInventario.getCodigoDigitador());
		pstm.setString(10, objInventario.getFechaIngreso());
		pstm.setString(11, objInventario.getHoraIngreso());
		pstm.setInt(12, objInventario.getFicha());
		int result = pstm.executeUpdate();
		pstm.close();
		return result;
	}
	
	public int getCountColumn(String almacen) throws SQLException{
		PreparedStatement pstm = Conexion.obtenerConexion().prepareStatement(""
				+ "select articulo,count(*) from prodtecni.tinfis where almacen=? and situacion='01' and secuencia=0 group by articulo order by 2 desc fetch first 1 rows only");
		pstm.setString(1, almacen);
		ResultSet rs = pstm.executeQuery();
		int result = 0 ;
		if(rs.next()){
			result = rs.getInt(2);
		}
		pstm.close();
		return result;
	}
	
	public List<Reporte> getReporteDiferencias(String almacen)
			throws SQLException {
		List<Reporte> inventarios = new ArrayList<Reporte>();
		PreparedStatement pstm = Conexion.obtenerConexion().prepareStatement(""
				+ "select a.articulo,c.artdes,c.artmed,a.zona,a.ubicacion,a.cantidad, "
				+ "ifnull((select b.cantidad from prodtecni.tinfis b where b.almacen=a.almacen and b.articulo=a.articulo and b.zona=a.zona and b.ubicacion=a.ubicacion and b.secuencia>0 order by secuencia desc fetch first 1 rows only) || '','') reconteo ,  "
				+ "ifnull((select sum(round(salact,0)) from prodtecni.tstock where salorg=a.almacen and salcod=a.articulo)|| '','0') stocka "
				+ "from prodtecni.tinfis a inner join speed400tc.tarti c on a.articulo=c.artcod "
				+ "where a.almacen=? and a.situacion='01' and a.secuencia=0 order by 1");
		pstm.setString(1, almacen);
		ResultSet rs = pstm.executeQuery();
		while(rs.next()){
			Reporte inventario = new Reporte();
			inventario.setCodigo(rs.getString("articulo"));
			inventario.setDescripcion(rs.getString("artdes"));
			inventario.setUmed(rs.getString("artmed"));
			inventario.setZona(rs.getString("zona"));
			inventario.setUbicacion(rs.getString("ubicacion"));
			inventario.setConteo(rs.getDouble("cantidad"));
			inventario.setReconteo(rs.getString("reconteo"));
			inventario.setStock(rs.getString("stocka"));
			inventarios.add(inventario);
		}
		rs.close();
		pstm.close();
		return inventarios;
	}
	
	public List<TSTOCK> getReporteDiferenciasPart2(String almacen)throws SQLException{
		List<TSTOCK> listado = new ArrayList<TSTOCK>();
		PreparedStatement pstm = Conexion.obtenerConexion().prepareStatement(""
				+ "select salcod,artdes,artmed,salact,salorg from prodtecni.tstock inner join tarti on salcod=artcod left outer join prodtecni.tinfis on salorg=almacen and salcod=articulo "
				+ "where salorg=?  and almacen is null");
		pstm.setString(1, almacen);
		ResultSet rs = pstm.executeQuery();
		while(rs.next()){
			TSTOCK tstock = new TSTOCK();
			tstock.setSalcod(rs.getString("salcod"));
			tstock.setArtdes(rs.getString("artdes"));
			tstock.setArtmed(rs.getString("artmed"));
			tstock.setSalact(rs.getDouble("salact"));
			tstock.setSalorg(rs.getString("salorg"));
			listado.add(tstock);
		}
		rs.close();
		pstm.close();
		return listado;
	}
	
	public List<Reporte> getReporteDiferenciasPorArticulo(String almacen,String articulo)
			throws SQLException {
		List<Reporte> inventarios = new ArrayList<Reporte>();
		PreparedStatement pstm = Conexion.obtenerConexion().prepareStatement(""
				+ "select a.articulo,c.artdes,c.artmed,a.zona,a.ubicacion,a.cantidad, "
				+ "ifnull((select b.cantidad from prodtecni.tinfis b where b.almacen=a.almacen and b.articulo=a.articulo and b.zona=a.zona and b.ubicacion=a.ubicacion and b.secuencia>0 order by secuencia desc fetch first 1 rows only) || '','') reconteo ,  "
				+ "ifnull((select cast(sum(round(salact,0)) as integer) from prodtecni.tstock where salorg=a.almacen and salcod=a.articulo)|| '','0') stocka "
				+ "from prodtecni.tinfis a inner join speed400tc.tarti c on a.articulo=c.artcod "
				+ "where a.almacen=? and a.articulo=? and a.situacion='01' and a.secuencia=0 order by 1");
		pstm.setString(1, almacen);
		pstm.setString(2, articulo);
		ResultSet rs = pstm.executeQuery();
		while(rs.next()){
			Reporte inventario = new Reporte();
			inventario.setCodigo(rs.getString("articulo"));
			inventario.setDescripcion(rs.getString("artdes"));
			inventario.setUmed(rs.getString("artmed"));
			inventario.setZona(rs.getString("zona"));
			inventario.setUbicacion(rs.getString("ubicacion"));
			inventario.setConteo(rs.getDouble("cantidad"));
			inventario.setReconteo(rs.getString("reconteo"));
			inventario.setStock(rs.getString("stocka"));
			inventarios.add(inventario);
		}
		rs.close();
		pstm.close();
		return inventarios;
	}
	
}
